#pragma once
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <BWAPI\Position.h>
#include <BWAPI\UnitType.h>
#include <AgentePrincipal.h>
using namespace std;
typedef pair<int,int> Ponto;
#define mp make_pair
#define X first
#define Y second
#define SETI set<Unidade*>::iterator
#define PROBE BWAPI::UnitTypes::Protoss_Probe
typedef BWAPI::Position Position;
typedef pair<BWAPI::Position,double> Par;
typedef BWAPI::UnitType TYPE;

struct No{
	Position Pos, BasePosition;
	double Dist;
	
	No(Position at, Position Base, double Dist){
		Pos = at;
		BasePosition = Base;
		this->Dist = Dist;
	}

	bool operator<(const No& other) const{
		return !(Pos.getDistance(BasePosition) + Dist < other.Pos.getDistance(BasePosition) + other.Dist);
	}
	
};

class MineChooser
{
	int CountUnitysWithType(set<Unidade*> Set, TYPE T);
	double Bfs(Position a, Position b);
	double UtilityFunction(Unidade* mina, Unidade* trabalhador, int cont);
	map<Unidade*,set<Unidade*> > minasUsadas;
	map<Unidade*,Unidade*> minaDoTrabalhador;
	const int x;
	const int y;
	const int PERTO;
	const int RAIO_MINERACAO;
	Ponto dx[8];
	set<Ponto> mark;
	priority_queue<No> fila;
	
public:
	map<Unidade*,double> DistanciaParaMinas;
	bool DistanciasCalculadas;
	void Init(Unidade* base);
	void AssignMine(Unidade* u);
	MineChooser(void);
	~MineChooser(void);
	
	
};
